Skip to content

Conversation

@gakonst
Copy link
Contributor

@gakonst gakonst commented Jan 21, 2026

Bug Report

Contract address pages (e.g., https://explore.tempo.xyz/address/0x0000f90827f1c53a10cb7a02335b175320002935) show "..." for the Created field.

Reported by Dan: https://tempoxyz.slack.com/archives/C0A87C21805/p1769027575403559

Root Cause

In AccountCardWithTimestamps, the logic to fetch the oldest transaction was broken:

const totalTransactions = 0 // Unknown until user navigates
const lastPageOffset = 0 // Can't calculate without total

const { data: oldestData } = useQuery({
  ...transactionsQueryOptions({...}),
  enabled: totalTransactions > 0,  // Always false!
})

Since totalTransactions was hardcoded to 0, the query to fetch the oldest transaction was never enabled.

Fix

Use sort=asc with limit=1 to directly fetch the oldest transaction, instead of trying to calculate the last page offset:

const { data: oldestData } = useQuery(
  transactionsQueryOptions({
    address,
    page: 1,
    limit: 1,
    offset: 0,
    sort: 'asc',
    _key: 'account-oldest',
  }),
)

Changes:

  • Add sort parameter to transactionsQueryOptions
  • Use sort: 'asc' in AccountCardWithTimestamps to fetch the oldest transaction
  • Remove the broken totalTransactions / enabled logic

Limitations

For newly created contracts, the creation transaction itself may still not appear in the transaction list because the IndexSupply query in /api/address/$address only searches from and to fields. Contract creation transactions have to: null and store the contract address in the receipt's contractAddress field.

A follow-up could:

  1. Query for contract creation txs where receipt contractAddress matches
  2. Or use a separate API to fetch contract creation info

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

Bundle Size Report

Metric Size Δ Change
Total 4.5 MB +3.0 KB (+0.1%)
Gzip 1.2 MB +1.0 KB (+0.1%)
Brotli 1.1 MB +906.0 B (+0.1%)
Chunk changes (>1KB)
Chunk Change
assets/router.js +2.7 KB

Compared against main branch (baseline from 1/23/2026, 3:40:56 AM)

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

Cloudflare Deployments

App Environment Status Preview
explorer devnet [OK] Deployed View Preview
explorer moderato [OK] Deployed View Preview
explorer presto [OK] Deployed View Preview
explorer testnet [OK] Deployed View Preview
fee-payer devnet [>>] Skipped No changes
fee-payer privy [>>] Skipped No changes
fee-payer testnet [>>] Skipped No changes
og - [>>] Skipped No changes
tokenlist - [>>] Skipped No changes

@o-az o-az self-requested a review January 22, 2026 23:52
gakonst and others added 3 commits January 22, 2026 21:22
The Created field was always showing '...' because:
1. totalTransactions was hardcoded to 0
2. The oldest transaction query was disabled (enabled: totalTransactions > 0)

Fix: Use sort=asc with limit=1 to directly fetch the oldest transaction
instead of trying to calculate the last page offset.

This adds the 'sort' parameter to transactionsQueryOptions and uses it
in AccountCardWithTimestamps to fetch the first (oldest) transaction.

Note: For contracts, the creation transaction may not appear if the
IndexSupply query doesn't include it (since contractAddress is in the
receipt, not the tx). A follow-up could address this by querying for
contract creation txs specifically.
For contracts with no transaction history, the Created field was showing
'...' because there were no transactions to derive the timestamp from.

This adds a new API endpoint /api/contract/creation/$address that:
1. Checks if the address is a contract (has bytecode)
2. Uses binary search to find the creation block
3. Returns the block number and timestamp

The AccountCardWithTimestamps component now:
- First tries to get the oldest transaction timestamp (for addresses)
- Falls back to the contract creation API for contracts without txs

This fixes the issue where https://explore.tempo.xyz/address/0x0000f90827f1c53a10cb7a02335b175320002935
showed '...' for Created because the contract creation tx wasn't in the
transaction history (IndexSupply only indexes from/to, not contractAddress).

Amp-Thread-ID: https://ampcode.com/threads/T-019be242-b261-775a-be3c-4afeef66f51b
Co-authored-by: Amp <amp@ampcode.com>
The binary search was taking ~40 seconds due to slow historical RPC calls.

Optimizations:
- Add in-memory cache to avoid repeated lookups for the same contract
- Parallelize the final batch of block checks
- Start search from block 1 instead of 0

This significantly improves response time for repeated requests.
@o-az o-az force-pushed the fix/contract-creation-display branch from c739a0f to 64e3016 Compare January 23, 2026 05:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants